#include<stdio.h>//标准输入输出
#include"ohos_init.h"//用于初始化服务和功能
#include"cmsis_os2.h"//CMSIS-RTOS API V2i

#include"iot_gpio.h"
#include"hi_gpio.h"
//海思SDK接口：IoT硬件设备操作接口-IO
//海思SDK接口，以hi_io_set_func(...)
#include"hi_io.h"
//定义GPIO引脚
#define SCK_GPIO 6
#define DOUT_GPIO 14

#define GapValue 430
uint32_t Weight_Maopi;
uint32_t HX711_Buffer;
int32_t Weight_Shiwu;
// float P=1;
// float P_;  //对应公式中的p'
// float X=0;
// float X_;  //X'
// float K=0;
// float Q=0.01;//噪声
// //float R=0.2;  //R如果很大，更相信预测值，那么传感器反应就会迟钝，反之相反
// float R=0.5;
// float distance=0;
// float distance1=0;
// float KLM(float Z)
// {
//   X_=X+0;
//   P_=P+Q;
//   K=P_/(P_+R);
//   X=X_+K*(Z-X_);
//   P=P_-K*P_;
//   return X;
// }

uint32_t Hx711_Read(void)
{
    uint32_t count;
    uint8_t i;
    IotGpioValue value=IOT_GPIO_VALUE0;
    // osDelay(0.001);
    IoTGpioSetOutputVal(SCK_GPIO,IOT_GPIO_VALUE0);
    // IoTGpioGetInputVal(DOUT_GPIO,&value);
    count=0;
    // IoTGpioGetInputVal(DOUT_GPIO,&value);
    //获取GPIO5引脚的输入电平（1高电平，0低电平）
    //调用IoTGpioGetInputVal接口
    // IoTGpioGetInputVal(DOUT_GPIO,&value);
    // // printf("开始dout的值是:%d\r\n",value);
    // printf("第一一个value:%d\n",value);
     do
        {
            IoTGpioGetInputVal(DOUT_GPIO,&value);
        // printf("open\n");
        }while(value);
    // printf("countvalue: ");
    for(i=0;i<24;i++)
    {
        
        // IoTGpioSetOutputVal(SCK_GPIO,i%2?IOT_GPIO_VALUE1:IOT_GPIO_VALUE0);
        IoTGpioSetOutputVal(SCK_GPIO,IOT_GPIO_VALUE1);//输出高电平
        // IoTGpioGetInputVal(DOUT_GPIO,&value);
        // osDelay(1);
        count=count<<1;//左移一位
        IoTGpioSetOutputVal(SCK_GPIO,IOT_GPIO_VALUE0);//输出低电平
        // IoTGpioGetInputVal(DOUT_GPIO,&value);
        // osDelay(1);
        //获取GPIO5引脚的输入电平（1高电平，0低电平）
        // //调用IoTGpioGetInputVal接口
        IoTGpioGetInputVal(DOUT_GPIO,&value);
        if(value)
        {
            count++;
        }
        printf("%d",value);
    }
    // osDelay(0.001);
    IoTGpioSetOutputVal(SCK_GPIO,IOT_GPIO_VALUE1);
    // IoTGpioGetInputVal(DOUT_GPIO,&value);
    count=count^0x800000;
    osDelay(70);
    IoTGpioSetOutputVal(SCK_GPIO,IOT_GPIO_VALUE0);
    // IoTGpioGetInputVal(DOUT_GPIO,&value);
    return (count);
}

void Get_Maopi(void)
{
    Weight_Maopi = Hx711_Read();
}


int32_t Get_Weight(void)
{
	HX711_Buffer = Hx711_Read();
    // printf("%d",(int32_t)HX711_Buffer);
	if(HX711_Buffer > Weight_Maopi)	
	{
    // printf("Hx711_Buffer的值：%d\n",HX711_Buffer);
		Weight_Shiwu = HX711_Buffer;
    // printf("Weight_Shiwu的值：%d\n",Weight_Shiwu);
		Weight_Shiwu = Weight_Shiwu-Weight_Maopi;			//获取实物的AD采样数值。
		Weight_Shiwu = (int32_t)((float)Weight_Shiwu/GapValue); 	//计算实物的实际重量
																		//因为不同的传感器特性曲线不一样，因此，每一个传感器需要矫正这里的GapValue这个除数。
																		//当发现测试出来的重量偏大时，增加该数值。

        // Weight_Shiwu=KLM(Weight_Shiwu);																		//如果测试出来的重量偏小时，减小改数值。
	}
    return(Weight_Shiwu);
}


static void Hx711Task(void *arg)
{
    (void)arg;
    //初始化GPIO模块
    IoTGpioInit(SCK_GPIO);
    IoTGpioInit(DOUT_GPIO);

    //设置GPIO0为GPIO功能
    hi_io_set_func(SCK_GPIO,HI_IO_FUNC_GPIO_6_GPIO);

    //设置GPIO0为输出模式
    IoTGpioSetDir(SCK_GPIO,IOT_GPIO_DIR_OUT);

    //设置GPIO1为GPIO功能
    hi_io_set_func(DOUT_GPIO,HI_IO_FUNC_GPIO_14_GPIO);

    //设置GPIO1为输入模式
    IoTGpioSetDir(DOUT_GPIO,IOT_GPIO_DIR_IN);


    

  osDelay(300);
	Get_Maopi();
    while (1)
    {
        Get_Weight();
        printf("净重量 = %d g\r\n",Weight_Shiwu); //打印 
		osDelay(200);
    }


}
static void Hx711Entry(void)
{
    osThreadAttr_t attr;
    attr.name="Hx711Task";
    attr.stack_size=102400;
    attr.priority=osPriorityNormal;
    if (osThreadNew(Hx711Task,NULL,&attr)==NULL)
    {
        printf("[Hx711Demo] Create LedTask failed!\n");
    }
}
//运行入口函数
SYS_RUN(Hx711Entry);


// void Init_HX711pin(void)//初始化
// {
// 	GPIO_setAsOutputPin(GPIO_PORT_P3,GPIO_PIN5);//sck
// 	GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P3, GPIO_PIN7);//dout
// }
// uint32_t HX711_Read(void)	//增益128
// {
// 	unsigned long count; 
// 	unsigned char i; 
// 	GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN7);//HX711_DOUT=1;
// 	delay_us(1);
// 	GPIO_setOutputLowOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=0; 
//   	count=0; 
//   	while(GPIO_getInputPinValue(GPIO_PORT_P3, GPIO_PIN7)); 
//   	for(i=0;i<24;i++)
// 	{ 
// 			GPIO_setOutputHighOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=1;
// 	  	count=count<<1; 
// 		delay_us(1);
// 		GPIO_setOutputLowOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=0; 
// 	  	if(GPIO_getInputPinValue(GPIO_PORT_P3, GPIO_PIN7))//HX711_DOUT=1
// 			count++; 
// 		delay_us(1);
// 	} 
//  	GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN5);//HX711_SCK=1;
//     count=count^0x800000;//第25个脉冲下降沿来时，转换数据
// 	delay_us(1);
// 	GPIO_setOutputLowOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=0;
// 	return(count);
// }